package indi.zhifa.recipe.bailan.framework.web.common.util;

import indi.zhifa.recipe.bailan.framework.common.entity.exception.ServiceException;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * Description: 
 * @Copyright: Copyright (c) 2020-2028 北京华咨电力科技发展有限公司 All rights reserved.
 * @author: 褚智勇(hataksumo@163.com)
 * @date:  2022/4/25 9:20
 */
public class ZFHttpUtil {

    private static final String UNKNOWN = "unknown";
    private static final String LOCALHOST = "127.0.0.1";
    private static final String SEPARATOR = ",";

    public static HttpServletRequest getServletRequest(){
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        if(null == requestAttributes){
            throw new ServiceException("获取requestAttributes 对象失败");
        }
        if(!(requestAttributes instanceof ServletRequestAttributes)){
            throw new ServiceException("该方法只支持基于servlet的程序");
        }
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)requestAttributes;
        HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
        return httpServletRequest;
    }

    public static HttpSession getHttpSession(){
        HttpServletRequest httpServletRequest = getServletRequest();
        return httpServletRequest.getSession();
    }

    public static HttpServletResponse getServletResponse(){
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        if(null == requestAttributes){
            throw new ServiceException("获取requestAttributes 对象失败");
        }
        if(!(requestAttributes instanceof HttpServletRequest)){
            throw new ServiceException("该方法只支持基于servlet的程序");
        }
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)requestAttributes;
        HttpServletResponse httpServletResponse = servletRequestAttributes.getResponse();
        return httpServletResponse;
    }

    public static String getRemoteIp(){
        HttpServletRequest request = getServletRequest();
        String ipAddress;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (LOCALHOST.equals(ipAddress)) {
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割
            // "***.***.***.***".length()
            if (ipAddress != null && ipAddress.length() > 15) {
                if (ipAddress.indexOf(SEPARATOR) > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress = "";
        }
        return ipAddress;
    }
}
